home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 3 / Info_Mac_1994-01.iso / Graphics / Utility / GL Viewer 1.1.1 / src ƒ / glview.c < prev    next >
C/C++ Source or Header  |  1993-09-06  |  7KB  |  325 lines

  1. /*-
  2.  * glview.c - main routines for grasp viewer.
  3.  *
  4.  * Macintosh version of GL Viewer, compiler: THINK C 5.0.x
  5.  *
  6.  * from XGRASP, Copyright (c) 1991 by Patrick J. Naughton
  7.  * 1993 THINK C 5.0.x version by Martin Fong (mwfong@nisc.sri.com)
  8.  *
  9.  */
  10.  
  11. #pragma segment GLView
  12.  
  13. #define DEBUG 1
  14. #define Version "1.1.1, 06-Sep-93"
  15.  
  16. #include <stdlib.h>
  17. #include "glassert.h"
  18. #include "grasp.h"
  19.  
  20.  
  21. char       *pname;
  22. int         imageloop = 0;
  23. int         showdirectory = 0;
  24. int         showtext = 0;
  25. int         printthecodes = 0;
  26. int         fQuiet  = 0;
  27. int         verbose = 0;
  28. int         imverbose = 0;
  29. Display    *dsp;
  30. Window      win;
  31. Visual     *vis;
  32. XVisualInfo vinfo;
  33. int         screen;
  34. int         planes;
  35. GC          gc;
  36. GC          gc1;
  37. long        whiteC;
  38. long        blackC;
  39. //Atom        protocol_atom;
  40. //Atom        kill_atom;
  41.  
  42. Bool        aboutdone = False;
  43.  
  44.  
  45. void about()
  46. {
  47.     fprintf(stderr, "\n%s, version %s\n\n",pname,Version);
  48.     fprintf(stderr,
  49. "This program tries to recreate the functionality provided by the PC\n"
  50. "program GRASPRT.EXE.  It plays animation files which usually have the\n"
  51. "extension .GL.  This file format is partially described by the\n"
  52. "documents found in the file 'docs'.  It has many missing features, but\n"
  53. "it is complete enough to view a large percentage of the GL files.\n\n");
  54.     fprintf(stderr,
  55. "The original Mac version was hacked from the X-Window source code,\n"
  56. "XGRASP (v1.7), available at anonymous ftp sites or e-mail to\n"
  57. "xgrasp@ankh.ftl.fl.us, and copyright (c) 1991 by Patrick J. Naughton.\n\n");
  58.  
  59.     fprintf(stderr, "Command line interface: file.gl -debugopts\n");
  60.     fprintf(stderr, "usage: file.gl -all -verbose -dir -textout -images -imverbose -printcodes\n");
  61.     aboutdone = True;
  62. }
  63.  
  64.  
  65. char       *
  66. strdup(s)
  67.     char       *s;
  68. {
  69.     char       *new = malloc((size_t) strlen(s) + 1);
  70.     return (new ? strcpy(new, s) : (char *) 0);
  71. }
  72.  
  73. void
  74. error(s1, s2)
  75.     char       *s1, *s2;
  76. {
  77.     if (!aboutdone) about();
  78.  
  79.     fprintf(stderr, s1, pname, s2);
  80.     XExit(1);
  81. }
  82.  
  83. void
  84. outi(s, i)
  85.     char       *s;
  86.     int         i;
  87. {
  88.     fprintf(stderr, "%s: %d\n", s, i);
  89. }
  90.  
  91. void
  92. outs(s1, s2)
  93.     char       *s1, *s2;
  94. {
  95.     fprintf(stderr, "%s: %s\n", s1, s2);
  96. }
  97.  
  98.  
  99. u_int
  100. GetByte(fp)
  101.     FILE       *fp;
  102. {
  103.     return (u_int) getc(fp);
  104. }
  105.  
  106. u_int
  107. GetWord(fp)
  108.     FILE       *fp;
  109. {
  110.     u_int      b1 = getc(fp);
  111.     u_int      b2 = getc(fp);
  112.  
  113.     return (u_int) (b1 + b2 * 256);
  114. }
  115.  
  116. u_long
  117. GetLong(fp)
  118.     FILE       *fp;
  119. {
  120.     u_long      b1 = getc(fp);
  121.     u_long      b2 = getc(fp);
  122.     u_long      b3 = getc(fp);
  123.     u_long      b4 = getc(fp);
  124.     u_long        retVal = b1 + (b2 + (b3 + b4 * 256L) * 256L) * 256L;
  125.  
  126.     return (retVal);
  127. }
  128.  
  129.  
  130. #define TOO_MANY_ENTRIES        256
  131.  
  132.  
  133. FilenameStruct *
  134. readdirectory(fp, count)
  135.     FILE       *fp;
  136.     int        *count;
  137. {
  138.     FilenameStruct *fn;
  139.     int         i;
  140.     int         len = GetWord(fp);
  141.     long        plen;
  142.     long        numEntries;
  143.  
  144.  
  145.     numEntries = (len / 17) - 1;
  146.     *count = numEntries;
  147.     if (0 >= *count || *count > TOO_MANY_ENTRIES)
  148.         error ("%s: Not a GL archive (# entries = %ld)\n", (char *) numEntries);
  149.  
  150.     fn = (FilenameStruct *) malloc((size_t) *count * sizeof(FilenameStruct));
  151.     assert (fn);
  152.  
  153.     for (i = 0; i < *count; i++) {
  154.         fn[i].offset = GetLong(fp);
  155.         fread(fn[i].fname, 13, 1, fp);
  156.         fn[i].fname[13] = 0;
  157.         lowerstr(fn[i].fname);
  158.         }
  159.     if (showdirectory) {
  160.       fprintf(stderr, "%13s   %6s  %6s\n", "Name", "offset", "hexoff" );
  161.       for (i = 0; i < *count; i++) {
  162.         /* if (i+1 == *count) plen= -1 else plen= fn[i+1].offset - fn[i].offset; */
  163.         fprintf(stderr, "%13s   %6ld   %6lX\n", fn[i].fname, fn[i].offset, fn[i].offset);
  164.         }
  165.       }
  166.     return (fn);
  167. }
  168.  
  169. usage()
  170. {
  171.     error("Error: Bad usage.\n", NULL);
  172. }
  173.  
  174.  
  175. #ifdef DEBUG
  176. /* command line reader for Mac/MPW  -- dgg */
  177. int readCmdOptions(FILE *cl, char ***argv)
  178. {
  179. #define MAXS    255
  180. #define    addarg(sptr)  if (strlen(sptr)>0) {    \
  181.     targv = (char **) realloc( targv, (argc+1) * sizeof(char *)); \
  182.     targv[argc] = (char *) malloc((size_t) 1+strlen(sptr) * sizeof(char));    \
  183.     assert (targv[argc]);    \
  184.     strcpy( targv[argc], sptr);  \
  185.     argc++; }
  186.     
  187.     char    *pword, st[MAXS];
  188.     const char    *progname = "glview";
  189.     
  190.     int     argc = 0;
  191.     char    **targv;
  192.     
  193.     targv = NULL;
  194.     addarg( progname);
  195.     fgets( st, MAXS, cl);
  196.     if (!feof(cl) && st!=NULL && *st!=0) {
  197.         pword = strtok( st, "\ \n");
  198.         while (pword!=NULL) {
  199.             addarg( pword);
  200.             pword = strtok( NULL, "\ \n");
  201.             }
  202.         }
  203.             
  204.     *argv = targv;
  205.     return argc;
  206. }
  207.  
  208.  
  209. int ccommand(char ***argv)
  210. {
  211.     int argc;
  212.     char    **targv;
  213.     
  214.     argc = readCmdOptions(stdin, &targv);
  215.     *argv = targv;
  216.     return argc;
  217. }
  218.  
  219. #endif DEBUG
  220.  
  221.  
  222.  
  223. real_main(argc, argv)
  224.     int         argc;
  225.     char       *argv[];
  226. {
  227.     char       *displayName = "GL View";
  228.     char       *filename = 0;
  229.     FILE       *fp;
  230.     FilenameStruct *dir;
  231.     int         count;
  232.     int         i;
  233.     OSType        SFTypes[4];
  234.     
  235.     //mac
  236.     SFTypes[0]='TEXT';
  237.     SFTypes[1]='BINA';
  238.     SFTypes[2]='GlVw';
  239.     SFTypes[3]='????';
  240.     filename = StdGetFile ((char *) "\pChoose GL File:", SFTypes, 4);
  241.  
  242.     pname = "GL Viewer";
  243.  
  244.  if (!filename) {
  245. #ifdef DEBUG
  246.     about();
  247.     fprintf(stderr, "command> ");
  248.     argc= ccommand(&argv);
  249.  
  250.     pname = argv[0];
  251.  
  252.     for (i = 1; i < argc; i++) {
  253.     char       *s = argv[i];
  254.     int         n = strlen(s);
  255.  
  256.     if (!strncmp("-dir", s, n))
  257.         showdirectory = 1;
  258.     else if (!strncmp("-textout", s, n))
  259.         showtext = 1;
  260.     else if (!strncmp("-images", s, n))
  261.         imageloop = 1;
  262.     else if (!strncmp("-verbose", s, n))
  263.         verbose = 1;
  264.     else if (!strncmp("-quiet", s, n))
  265.         fQuiet = 1;
  266.     else if (!strncmp("-imverbose", s, n))
  267.         imverbose = 1;
  268.     else if (!strncmp("-printcodes", s, n))
  269.         printthecodes = 1;
  270.     else if (!strncmp("-all", s, n)) {
  271.         showdirectory = 1;
  272.         showtext = 1;
  273.         imageloop = 1;
  274.         verbose = 1;
  275.         imverbose = 1;
  276.         printthecodes = 1;
  277.         }
  278.     else if (filename || s[0] == '-')
  279.         usage();
  280.     else
  281.         filename = s;
  282.     }
  283.     
  284.     if (!filename) error("%s: No gl file selected.\n", NULL);
  285.     
  286. #else
  287.     error("%s: No gl file selected.\n");
  288. #endif
  289. }
  290.  
  291.     {
  292.         CursHandle hWatchCursor = GetCursor (watchCursor);
  293.  
  294.  
  295.         if (hWatchCursor /* != (CursHandle) NULL */)
  296.         {
  297.             HLock ((Handle) hWatchCursor);
  298.             SetCursor (*hWatchCursor);
  299.             ReleaseResource (hWatchCursor);
  300.         }
  301.     }
  302.  
  303.     displayName = filename;
  304.     if (!(dsp = XOpenDisplay(displayName)))
  305.          error("%s: unable to open display.\n", NULL );
  306.     
  307.     fp = fopen(filename, "rb");
  308.     if (!fp) error("%s: %s not found.\n", filename);
  309.     
  310.     if (verbose) fprintf(stderr, "\n readdirectory...\n");
  311.     dir = readdirectory(fp, &count);
  312.  
  313.     if (verbose) fprintf(stderr, "\n readfiles...\n");
  314.     readfiles(fp, dir, count);
  315.     fclose(fp);
  316.  
  317.     InitCursor ();
  318.  
  319.     if (verbose) fprintf(stderr, "\n execfile...\n");
  320.     if (numexecs == 0)
  321.         error ("%s: no text script file found.\n", NULL);
  322.     execfile(execRec[0], 0);
  323.     XExit(0);
  324. }
  325.